package day19;

import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;

public class Demo02 {
	public static void main(String[] args) throws Exception {
		test09();
	}

	private static void test09() {
		// 要获取src下所有的".java"文件
		File f = new File("./src");

		check(f);

	}

	private static void check(File f) {
		if (f.isDirectory()) {
			File[] fs = f.listFiles();
			for (File f0 : fs) {
				check(f0);
			}
		}

		if (f.getName().endsWith(".java")) {
			System.out.println(f.getAbsolutePath());
		}

	}

	private static void test08() {
		File f = new File("./src");

		// 文件过滤器
		// 以匿名内部类的形式直接对接口进行实现
		FileFilter filter = new FileFilter() {
			@Override
			public boolean accept(File pathname) {
				// 目标目录下每个文件的File对象
				// System.out.println(pathname);
				return pathname.isDirectory();
			}
		};

		File[] fs = f.listFiles(filter);
		System.out.println(fs.length);
		for (File f0 : fs) {
			System.out.println(f0.getAbsolutePath());
		}

	}

	private static void test07() {
		File f = new File("./src");

		// 文件名过滤器
		// 以匿名内部类的形式直接对接口进行实现
		FilenameFilter filter = new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				// 目录下每个文件的父级
				// System.out.println(dir);
				// 目录下每个文件的文件名
				// System.out.println(name);
				return name.endsWith(".properties");
			}
		};

		String[] arr = f.list(filter);
		System.out.println(arr.length);
		for (String n : arr) {
			System.out.println(n);
		}
	}

	// 获取目标目录下的内容
	private static void test06() {
		File f = new File("./src");
		// System.out.println(f.exists());

		// 获取目标目录下所有内容的名称
		String[] arr = f.list();
		//		System.out.println(arr.length);
		//		for (String p : arr) {
		//			System.out.println(p);
		//		}

		File[] arr2 = f.listFiles();
		System.out.println(arr2.length);
		for (File f0 : arr2) {
			// System.out.println(f0.getPath());
			System.out.println(f0.getAbsolutePath());
		}

	}

	private static void test05() throws IOException {
		File f = new File("./some/other/aaa.txt");
		System.out.println(f.exists());

		// 创建标准文件
		// 创建目标是路径中的最后一级
		// 要求其父级目录要存在
		// f.createNewFile();

		// 创建目录
		// 创建目标是路径中的最后一级
		// 要求其父级目录要存在
		// f.mkdir();

		// 要创建目标的父级不存在
		// 可以通过mkdirs()来创建整个目录树
		// f.mkdirs();

		// 当要创建的目标文件路径上有多个层级不存在
		// 在创建目标文件之前, 应当先判断其父级是否存在
		// 如果目标的父级不存在, 将父级创建出来
		// 然后再创建目标文件
		File parent = f.getParentFile();
		if (!parent.exists()) {
			System.out.println(parent.mkdirs());
		}
		System.out.println(f.createNewFile());
	}

	private static void test04() {
		File f = new File("./some.txt");
		System.out.println(f.exists());
		try {
			// 创建目标文件
			// 如果目标文件已存在, 则返回false
			boolean flag = f.createNewFile();
			System.out.println(flag);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static void test03() {

		// 相对路径, 以当前目录为为标创建一个File对象
		File f = new File("./src/some.properties");
		File f2 = new File("D:/some");

		// 获取出怎样的路径, 取决于创建File对象是使用的是什么样的路径
		System.out.println(f.getPath());

		// 不论是相对路径还是绝对路径创建的File对象, 都是获取到绝对路径
		System.out.println(f.getAbsolutePath());

		// 判断创建File对象时使用的是否是绝对路径
		System.out.println(f.isAbsolute());

		// 判断目标是否是一个目录
		System.out.println(f.isDirectory());

		// 判断目标是否是一个标准文件(除目录外, 其它的都算标准文件)
		System.out.println(f.isFile());

		// 文件长度: 文件所占用的磁盘大小(字节)
		System.out.println(f.length());

		// 获取目录下的内容, 如果目标不是目录, 方法会得到null
		// String[] arr = f.list();
		// System.out.println(arr.length);
		String[] arr2 = f2.list();
		System.out.println(arr2.length);

	}

	private static void test02() {
		File dir = new File("D:/some/some.txt");
		System.out.println(dir.exists());
		System.out.println(dir.canRead());
		System.out.println(dir.canWrite());
		System.out.println(dir.canExecute());
		System.out.println(dir.getName());
		System.out.println(dir.getParent()); // 获取父级的路径字符串
		System.out.println(dir.getParentFile()); // 获取父级的File对象

		System.out.println(dir.getPath());
		System.out.println(dir.getAbsolutePath());

		System.out.println(dir.isAbsolute());
		System.out.println(dir.isDirectory());

	}

	public static void test01() {
		System.out.println(File.separator);
		String url = "." + File.separator + "src" + File.separator + "some";
		System.out.println(url);

		String url2 = "D:\\教学\\课堂视频";
		String url3 = "D:/教学/课堂视频";

		// 通过路径创建File类对象时, 并不能确定目标在磁盘中是否真实存在
		// 只有在通过该对象操作目标时, 才能明确
		File f = new File("D:/教学/课堂视频");
		File f2 = new File("D:/教学/some");
		File f3 = new File("D:/教学", "some");
	}
}
